from typing import Dict, List, Any, Optional

# 项目相关工具定义
class ProjectTools:
    def __init__(self, http_client):
        self.http = http_client
    
    def get_projects(self, params: Optional[Dict[str, Any]] = None):
        """获取项目列表"""
        print('获取项目列表')
        response = self.http.get('/api.php/v1/projects', params=params)
        print(response)
        return response
        
    def create_project(self, data: Dict[str, Any]):
        """添加单个项目"""
        print('创建新项目')
        print(data)
        response = self.http.post('/api.php/v1/projects', json=data)
        print(response)
        return response
        
    def get_project_detail(self, project_id: int):
        """获取项目详情"""
        print(f'获取项目ID={project_id}的详情')
        response = self.http.get(f'/api.php/v1/projects/{project_id}')
        print(response)
        return response
        
    def update_project(self, project_id: int, data: Dict[str, Any]):
        """编辑项目"""
        print(f'编辑项目ID={project_id}的信息')
        response = self.http.put(f'/api.php/v1/projects/{project_id}', json=data)
        print(response)
        return response
        
    def delete_project(self, project_id: int):
        """删除项目"""
        print(f'删除项目ID={project_id}')
        response = self.http.delete(f'/api.php/v1/projects/{project_id}')
        print(response)
        return response
    
    # 用于注册工具到MCP
    def register(self, mcp_instance):
        """
        将所有项目工具注册到MCP实例
        
        Args:
            mcp_instance: FastMCP实例
        """
        mcp_instance.add_tool(
            self.get_projects, 
            name="get_projects", 
            description="获取项目列表。参数：可选params(Dict)包含筛选条件如status(状态，如wait/doing/done)、limit(每页数量)、page(页码)、order(排序方式)、name(按项目名称搜索)等。不传参数时获取所有项目。"
        )
        
        mcp_instance.add_tool(
            self.create_project, 
            name="create_project", 
            description="创建新项目。参数：data(Dict，必填)包含项目信息，必填字段有name(项目名称)、code(项目代号)、begin(开始日期，格式如'2023-01-01')、end(结束日期)，可选字段有PM(项目负责人ID，可从get_users获取)、products(关联产品ID数组，可从get_products获取)、desc(描述)、acl(访问控制)等。需要项目管理员或系统管理员权限。"
        )
        
        mcp_instance.add_tool(
            self.get_project_detail, 
            name="get_project_detail", 
            description="获取项目详情。参数：project_id(int，必填)项目ID。项目ID可从get_projects方法返回的列表中获取。"
        )
        
        mcp_instance.add_tool(
            self.update_project, 
            name="update_project", 
            description="编辑项目信息。参数：project_id(int，必填)项目ID；data(Dict，必填)包含要更新的字段，如name(项目名称)、begin(开始日期)、end(结束日期)、status(状态)等。项目ID可从get_projects获取，现有项目信息可从get_project_detail获取。需要项目负责人或管理员权限。"
        )
        
        mcp_instance.add_tool(
            self.delete_project, 
            name="delete_project", 
            description="删除项目。参数：project_id(int，必填)要删除的项目ID。项目ID可从get_projects方法返回的列表中获取。注意：删除项目会同时删除相关的任务、构建等数据，请谨慎操作。需要管理员权限。"
        ) 